<html lang="zh-CN"><head><meta charset="UTF-8"><style>.nodata  main {width:1000px;margin: auto;}</style></head><body class="nodata " style=""><div class="main_father clearfix d-flex justify-content-center " style="height:100%;"> <div class="container clearfix " id="mainBox"><main><div class="blog-content-box">
<div class="article-header-box">
<div class="article-header">
<div class="article-title-box">
<h1 class="title-article" id="articleContentId">(B卷,200分)- 不开心的小朋友（Java & JS & Python）</h1>
</div>
</div>
</div>
<div id="blogHuaweiyunAdvert"></div>

        <div id="article_content" class="article_content clearfix">
        <link rel="stylesheet" href="https://csdnimg.cn/release/blogv2/dist/mdeditor/css/editerView/kdoc_html_views-1a98987dfd.css">
        <link rel="stylesheet" href="https://csdnimg.cn/release/blogv2/dist/mdeditor/css/editerView/ck_htmledit_views-044f2cf1dc.css">
                <div id="content_views" class="htmledit_views">
                    <h4 id="main-toc">题目描述</h4> 
<p>游乐场里增加了一批摇摇车&#xff0c;非常受小朋友欢迎&#xff0c;但是每辆摇摇车同时只能有一个小朋友使用&#xff0c;如果没有空余的摇摇车&#xff0c;需要排队等候&#xff0c;或者直接离开&#xff0c;最后没有玩上的小朋友会非常不开心。</p> 
<p>请根据今天小朋友的来去情况&#xff0c;统计不开心的小朋友数量。</p> 
<ol><li>摇摇车数量为N&#xff0c;范围是: 1 ≤ N &lt; 10&#xff1b;</li><li>每个小朋友都对应一个编码&#xff0c;编码是不重复的数字&#xff0c;今天小朋友的来去情况&#xff0c;可以使用编码表示为&#xff1a;1 1 2 3 2 3。(若小朋友离去之前有空闲的摇摇车&#xff0c;则代表玩耍后离开&#xff1b;不考虑小朋友多次玩的情况)。小朋友数量 ≤ 100</li><li>题目保证所有输入数据无异常且范围满足上述说明。</li></ol> 
<p></p> 
<h4 id="%E8%BE%93%E5%85%A5%E6%8F%8F%E8%BF%B0">输入描述</h4> 
<p>第一行: 摇摇车数量<br /> 第二行: 小朋友来去情况</p> 
<p></p> 
<h4 id="%E8%BE%93%E5%87%BA%E6%8F%8F%E8%BF%B0">输出描述</h4> 
<p>返回不开心的小朋友数量</p> 
<p></p> 
<h4 id="%E7%94%A8%E4%BE%8B">用例</h4> 
<table border="1" cellpadding="1" cellspacing="1" style="width:500px;"><tbody><tr><td style="width:86px;">输入</td><td style="width:412px;">1<br /> 1 2 1 2</td></tr><tr><td style="width:86px;">输出</td><td style="width:412px;">0</td></tr><tr><td style="width:86px;">说明</td><td style="width:412px;">第一行&#xff0c;1个摇摇车<br /> 第二行&#xff0c;1号来 2号来(排队) 1号走 2号走 (1号走后摇摇车已有空闲&#xff0c;所以玩后离开)</td></tr></tbody></table> 
<table border="1" cellpadding="1" cellspacing="1" style="width:500px;"><tbody><tr><td style="width:86px;">输入</td><td style="width:412px;">1<br /> 1 2 2 3 1 3</td></tr><tr><td style="width:86px;">输出</td><td style="width:412px;">1</td></tr><tr><td style="width:86px;">说明</td><td style="width:412px;"> <p>第一行&#xff0c;1个摇摇车</p> <p>第二行&#xff0c;1号来 2号来(排队) 2号走(不开心离开) 3号来(排队) 1号走 3号走(1号走后摇摇车已有空闲&#xff0c;所以玩后离开)</p> </td></tr></tbody></table> 
<h4 id="%E9%A2%98%E7%9B%AE%E8%A7%A3%E6%9E%90">题目解析</h4> 
<p>本题应该只是逻辑分析题。</p> 
<p></p> 
<p>我的解题思路如下&#xff1a;</p> 
<p>定义一个playing集合&#xff0c;用于记录正在玩摇摇车的小朋友。</p> 
<p>定义一个waiting队列&#xff0c;用于记录正在排队的小朋友。</p> 
<p></p> 
<p>然后遍历小朋友编号列表&#xff0c;被遍历的小朋友设为kid</p> 
<p>首先&#xff0c;需要判断 kid 的状态&#xff0c;kid可能是三种状态&#xff1a;</p> 
<ul><li>正在玩摇摇车&#xff08;即在playing集合中&#xff09;</li><li>正在排队&#xff08;即在waiting集合中&#xff09;</li><li>新加入的&#xff08;即既不在playing中&#xff0c;也不在waitingzhong1&#xff09;</li></ul> 
<p>针对不同状态的kid&#xff0c;我们应该做如下处理&#xff1a;</p> 
<ul><li>如果 kid 在 playing 中存在&#xff0c;则本次kid编号出现&#xff0c;代表kid玩好了&#xff0c;开心地离开了。</li></ul> 
<blockquote> 
 <p>当playing集合中有kid开心地离开后&#xff0c;此时我们还应该检查waiting队列是否有小朋友排队&#xff0c;如果有&#xff0c;我们应该立即将队头的小朋友加入playing集合&#xff0c;即让排在队头的小朋友玩摇摇车。</p> 
</blockquote> 
<ul><li>如果 kid 在 waiting 中存在&#xff0c;则本次kid编号出现&#xff0c;代表kid没有玩上&#xff0c;不开心地离开了。</li><li>如果 kid 既不在playing&#xff0c;也不在waiting&#xff0c;则说明kid是新加入的&#xff0c;此时我们需要检查摇摇车是否还有剩余</li></ul> 
<ol><li>如果palying.size &lt; n&#xff0c;则代表摇摇车还有剩余&#xff0c;则此时kid可以直接去玩&#xff0c;即加入playing集合</li><li>如果playing.size &#61;&#61; n&#xff0c;则代表摇摇车用完了&#xff0c;则此时kid只能去排队&#xff0c;即加入waiting队列</li></ol> 
<p></p> 
<h4 id="%E7%AE%97%E6%B3%95%E6%BA%90%E7%A0%81">JS算法源码</h4> 
<pre><code class="language-javascript">/* JavaScript Node ACM模式 控制台输入获取 */
const readline &#61; require(&#34;readline&#34;);

const rl &#61; readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

const lines &#61; [];
rl.on(&#34;line&#34;, (line) &#61;&gt; {
  lines.push(line);

  if (lines.length &#61;&#61; 2) {
    const n &#61; parseInt(lines[0]);
    const kids &#61; lines[1].split(&#34; &#34;);

    console.log(getResult(n, kids));

    lines.length &#61; 0;
  }
});

function getResult(n, kids) {
  // 不开心的小朋友数量
  let unHappy &#61; 0;

  // 已在摇摇车上的小朋友编号
  const playing &#61; new Set();
  // 正在排队的小朋友编号
  const waiting &#61; [];

  for (let kid of kids) {
    if (playing.has(kid)) {
      // 如果kid是摇摇车上的小朋友编号, 则代表kid玩好了要离开
      playing.delete(kid);

      // 如果kid离开后&#xff0c;摇摇车有空位了&#xff0c;如果此时有人排队&#xff0c;则让排队的人上车玩
      if (waiting.length &gt; 0) {
        playing.add(waiting.shift());
      }

      continue;
    }

    // 如果kid不是摇摇车上的小朋友&#xff0c;则检查kid是不是排队的小朋友
    const index &#61; waiting.indexOf(kid);
    if (index !&#61; -1) {
      // 如果是排队的小朋友&#xff0c;则说明kid没有玩到摇摇车&#xff0c;因此会不开心的离开
      unHappy&#43;&#43;;
      waiting.splice(index, 1);
      continue;
    }

    // 如果kid既不是摇摇车上的小朋友&#xff0c;也不是排队的小朋友&#xff0c;则是新来的小朋友
    if (playing.size &lt; n) {
      // 如果摇摇车还有空位&#xff0c;则直接玩
      playing.add(kid);
    } else {
      // 如果摇摇车没有空位了&#xff0c;则需要排队
      waiting.push(kid);
    }
  }

  return unHappy;
}
</code></pre> 
<h4>Java算法源码</h4> 
<pre><code class="language-java">import java.util.HashSet;
import java.util.LinkedList;
import java.util.Scanner;

public class Main {
  public static void main(String[] args) {
    Scanner sc &#61; new Scanner(System.in);

    int n &#61; Integer.parseInt(sc.nextLine());
    String[] kids &#61; sc.nextLine().split(&#34; &#34;);

    System.out.println(getResult(n, kids));
  }

  public static int getResult(int n, String[] kids) {
    // 不开心的小朋友数量
    int unHappy &#61; 0;

    // 已在摇摇车上的小朋友编号
    HashSet&lt;String&gt; playing &#61; new HashSet&lt;&gt;();
    // 正在排队的小朋友编号
    LinkedList&lt;String&gt; waiting &#61; new LinkedList&lt;&gt;();

    for (String kid : kids) {
      if (playing.contains(kid)) {
        // 如果kid是摇摇车上的小朋友编号, 则代表kid玩好了要离开
        playing.remove(kid);

        // 如果kid离开后&#xff0c;摇摇车有空位了&#xff0c;如果此时有人排队&#xff0c;则让排队的人上车玩
        if (waiting.size() &gt; 0) {
          playing.add(waiting.removeFirst());
        }

        continue;
      }

      // 如果kid不是摇摇车上的小朋友&#xff0c;则检查kid是不是排队的小朋友
      int index &#61; waiting.indexOf(kid);
      if (index !&#61; -1) {
        // 如果是排队的小朋友&#xff0c;则说明kid没有玩到摇摇车&#xff0c;因此会不开心的离开
        unHappy&#43;&#43;;
        waiting.remove(index);
        continue;
      }

      // 如果kid既不是摇摇车上的小朋友&#xff0c;也不是排队的小朋友&#xff0c;则是新来的小朋友
      if (playing.size() &lt; n) {
        // 如果摇摇车还有空位&#xff0c;则直接玩
        playing.add(kid);
      } else {
        // 如果摇摇车没有空位了&#xff0c;则需要排队
        waiting.add(kid);
      }
    }

    return unHappy;
  }
}
</code></pre> 
<h4>Python算法源码</h4> 
<pre><code class="language-python"># 输入获取
n &#61; int(input())
kids &#61; input().split()


# 算法入口
def getResult():
    # 不开心的小朋友数量
    unHappy &#61; 0

    # 已在摇摇车上的小朋友编号
    playing &#61; set()
    # 正在排队的小朋友编号
    waiting &#61; []

    for kid in kids:
        if kid in playing:
            # 如果kid是摇摇车上的小朋友编号, 则代表kid玩好了要离开
            playing.remove(kid)

            # 如果kid离开后&#xff0c;摇摇车有空位了&#xff0c;如果此时有人排队&#xff0c;则让排队的人上车玩
            if len(waiting) &gt; 0:
                playing.add(waiting.pop(0))
            continue

        # 如果kid不是摇摇车上的小朋友&#xff0c;则检查kid是不是排队的小朋友
        if kid in waiting:
            # 如果是排队的小朋友&#xff0c;则说明kid没有玩到摇摇车&#xff0c;因此会不开心的离开
            unHappy &#43;&#61; 1
            waiting.pop(waiting.index(kid))
            continue

        # 如果kid既不是摇摇车上的小朋友&#xff0c;也不是排队的小朋友&#xff0c;则是新来的小朋友
        if len(playing) &lt; n:
            # 如果摇摇车还有空位&#xff0c;则直接玩
            playing.add(kid)
        else:
            # 如果摇摇车没有空位了&#xff0c;则需要排队
            waiting.append(kid)

    return unHappy


# 算法调用
print(getResult())
</code></pre>
                </div>
        </div>
        <div id="treeSkill"></div>
        <div id="blogExtensionBox" style="width:400px;margin:auto;margin-top:12px" class="blog-extension-box"></div>
    <script>
  $(function() {
    setTimeout(function () {
      var mathcodeList = document.querySelectorAll('.htmledit_views img.mathcode');
      if (mathcodeList.length > 0) {
        for (let i = 0; i < mathcodeList.length; i++) {
          if (mathcodeList[i].naturalWidth === 0 || mathcodeList[i].naturalHeight === 0) {
            var alt = mathcodeList[i].alt;
            alt = '\\(' + alt + '\\)';
            var curSpan = $('<span class="img-codecogs"></span>');
            curSpan.text(alt);
            $(mathcodeList[i]).before(curSpan);
            $(mathcodeList[i]).remove();
          }
        }
        MathJax.Hub.Queue(["Typeset",MathJax.Hub]);
      }
    }, 1000)
  });
</script>
</div></html>